package co.com.desarrollo.pedidos.services.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.com.desarrollo.pedidos.dao.ProductoDAO;
import co.com.desarrollo.pedidos.dao.TipoProductoDAO;
import co.com.desarrollo.pedidos.entities.Producto;
import co.com.desarrollo.pedidos.entities.TipoProducto;
import co.com.desarrollo.pedidos.services.ProductoService;
import co.com.desarrollo.pedidos.services.exceptions.ProductoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.TipoProductoNotFoundException;

@Service("productoService")
public class ProductoServiceImpl implements ProductoService {

	@Autowired
	private TipoProductoDAO tipoProductoDAO;
	@Autowired
	private ProductoDAO productoDAO;
	
	@Override
	public void deleteTipoProductoById(TipoProducto tipoProducto) {
		tipoProductoDAO.delete(tipoProducto.getIdtipoProducto());
	}

	@Override
	public List<TipoProducto> getAllTipoProducto() {
		return tipoProductoDAO.findAll();
	}

	@Override
	public TipoProducto getTipoProductoById(TipoProducto tipoProducto) {
		return tipoProductoDAO.findById(tipoProducto.getIdtipoProducto());
	}

	@Override
	public TipoProducto getTipoProductoByName(TipoProducto tipoProducto) {
		return tipoProductoDAO.findByName(tipoProducto.getNombre());
	}

	@Override
	public TipoProducto setTipoProducto(TipoProducto tipoProducto) {
		return tipoProductoDAO.store(tipoProducto);
	}

	@Override
	public List<Producto> getAllProductos() {
		return productoDAO.findAll();
	}

	@Override
	public Producto getProductoById(Producto producto) {
		return productoDAO.findById(producto.getIdproducto());
	}

	@Override
	public Producto getProductoByName(Producto producto) {
		return productoDAO.findByName(producto.getNombre());
	}

	@Override
	public List<Producto> getProductosActivos() {
		return productoDAO.findProductosActivos();
	}

	@Override
	public List<Producto> getProductosActivosByTipoProducto(TipoProducto tipoProducto) throws TipoProductoNotFoundException {
		tipoProducto = findTipoProductoBothMethods(tipoProducto);
		return productoDAO.findProductosActivosByTipoProducto(tipoProducto.getIdtipoProducto());
	}

	@Override
	public Producto setProducto(Producto producto) throws TipoProductoNotFoundException {
		TipoProducto tipoProducto = findTipoProductoBothMethods(producto.getTipoProducto());
		producto.setTipoProducto(tipoProducto);
		return productoDAO.store(producto);
	}

	@Override
	public Producto activarProducto(Producto producto) throws ProductoNotFoundException, TipoProductoNotFoundException {
		producto = findProductoBothMethods(producto);
		producto.setActivo(1);
		return setProducto(producto);
	}

	@Override
	public Producto desactivarProducto(Producto producto) throws ProductoNotFoundException, TipoProductoNotFoundException {
		producto = findProductoBothMethods(producto);
		producto.setActivo(0);
		return setProducto(producto);
	}
	
	public Producto findProductoBothMethods(Producto producto) throws ProductoNotFoundException	{
		Producto productoFound = getProductoById(producto);
		if (productoFound == null)
			producto = getProductoByName(producto);
		else
			producto = productoFound;
		if (producto!=null)
			return producto;
		throw new ProductoNotFoundException("El producto solicitado no existe.");
	}
	
	public TipoProducto findTipoProductoBothMethods(TipoProducto tipoProducto) throws TipoProductoNotFoundException	{
		TipoProducto tipoProductoFound = getTipoProductoById(tipoProducto);
		if (tipoProductoFound == null)
			tipoProducto = getTipoProductoByName(tipoProducto);
		else
			tipoProducto = tipoProductoFound;
		if (tipoProducto != null)
			return tipoProducto;
		throw new TipoProductoNotFoundException("El tipo producto solicitado no existe.");
	}
}
